﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmElencoAttivita : Form
    {
        private Utente User;
        private DataTable dataDett;
        private DataTable tableAttività;
        private List<DettaglioAttivita> ListaDettAttivita;
        private List<Attivita> listaAttivita;

        public frmElencoAttivita(Utente utente)
        {
            InitializeComponent();
            dataDett = new DataTable();
            tableAttività = new DataTable();
            ListaDettAttivita = new List<DettaglioAttivita>();
            User = utente;
            getCombo();
            ControllaPermessi();
            ImpostaGrigliaAttivita();
            Cerca();
        }

        private void getCombo()
        {
            cmbFiltro.Items.Add("Corso");
            cmbFiltro.Items.Add("Codice");
            cmbFiltro.Items.Add("Data Inizio");
            cmbFiltro.Items.Add("Data Fine");
            cmbFiltro.SelectedIndex = 0;
        }

        private void CancellaAttivita()
        {
            if (gridAttivita.Rows.Count > 0
                && gridAttivita.SelectedRows.Count == 1)
            {
                DialogResult scelta = MessageBox.Show("Vuoi cancellare l'attivita? In questo modo anche il dettaglio sarà cancellato"
                    , "Attenzione", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (scelta == DialogResult.Yes)
                {
                    Corso corso = new ctrlAttivita(null)
                        .GetAttivitabyId((Guid)gridAttivita.SelectedRows[0].Cells["Id"].Value).Corso;
                    new ctrlCorso().UpdateDataFineNULL(corso);
                    new ctrlPersona().setPersonaToAttivitaNULL((Guid)gridAttivita.SelectedRows[0].Cells["Id"].Value);
                    new ctrlAttivita(null).Delete((Guid)gridAttivita.SelectedRows[0].Cells["Id"].Value);
                    Cerca();
                }
            }
        }

        private void ImpostaGrigliaAttivita()
        {
            tableAttività.Columns.Add("Id", typeof(Guid));
            tableAttività.Columns.Add("Codice", typeof(string));
            tableAttività.Columns.Add("Corso", typeof(string));
            tableAttività.Columns.Add("Data Inizio", typeof(string));
            tableAttività.Columns.Add("Data Fine", typeof(string));
            tableAttività.Columns.Add("Aula", typeof(string));
            tableAttività.Columns.Add("Descrizione", typeof(string));
        }

        private void RiempiTableAttività()
        {
            tableAttività.Rows.Clear();

            foreach (Attivita attività in listaAttivita)
            {
                DateTime data = DateTime.MinValue;
                if (attività.Corso != null && attività.Corso.DataFine != null)
                {
                    data = (DateTime)attività.Corso.DataFine;
                }
                tableAttività.Rows.Add(
                    attività.Id,
                    attività.Corso == null ? "" : attività.Corso.Codice,
                    attività.ToString(),
                    attività.Corso != null ? attività.Corso.DataInizio.ToLongDateString() : "",
                    attività.Corso != null ? attività.Corso.DataFine != null ? data.ToLongDateString() : "Da Definire" : "Indeterminato",
                    attività.Stanza.Numero,
                    attività.Descrizione
                    );
            }
            gridAttivita.DataSource = tableAttività;
            gridAttivita.Columns["Id"].Visible = false;
            gridAttivita.Columns["Data Inizio"].DefaultCellStyle.Format = "dddd dd MMMM yyyy";
            gridAttivita.Columns["Data Fine"].DefaultCellStyle.Format = "dddd dd MMMM yyyy";
            gridAttivita.Columns["Data Fine"].FillWeight = 160;
            gridAttivita.Columns["Data Inizio"].FillWeight = 160;
            gridAttivita.Columns["Corso"].FillWeight = 160;
            gridAttivita.Columns["Aula"].FillWeight = 35;
        }

        private void Cerca()
        {
            ctrlAttivita cAttività = new ctrlAttivita(null);
            listaAttivita = cAttività.SelectAllAttività();
            string campo = "";

            if (cmbFiltro.SelectedIndex == 0)
                campo = "Corso";
            else if (cmbFiltro.SelectedIndex == 1)
                campo = "Codice";
            else if (cmbFiltro.SelectedIndex == 2)
                campo = "Data Inizio";
            else if (cmbFiltro.SelectedIndex == 3)
                campo = "Data Fine";
            if (string.IsNullOrEmpty(txtCerca.Text))
            {
                tableAttività.DefaultView.RowFilter = "";
            }
            else
            {
                string testo = txtCerca.Text.Replace("'", "''");
                string temp = "[" + campo + "] LIKE '%" + testo + "%'";
                tableAttività.DefaultView.RowFilter = temp;
            }

            RiempiTableAttività();
        }

        private void FormattaGriglia()
        {
            dataDett.Columns.Clear();
            dataDett.Rows.Clear();
            dataDett.Columns.Add("Id", typeof(Guid));
            dataDett.Columns.Add("Giorno", typeof(DateTime));
            dataDett.Columns.Add("Inizio", typeof(DateTime));
            dataDett.Columns.Add("Fine", typeof(DateTime));

            gridDettAttivita.DataSource = dataDett;
            gridDettAttivita.Columns["Id"].Visible = false;
            gridDettAttivita.Columns["Giorno"].DefaultCellStyle.Format = "dddd dd MMMM yyyy";
            gridDettAttivita.Columns["Inizio"].DefaultCellStyle.Format = "HH:mm";
            gridDettAttivita.Columns["Fine"].DefaultCellStyle.Format = "HH:mm";
        }

        private void getAttivitaDettaglio()
        {
            if (gridAttivita.Rows.Count == 0) { return; }

            ctrlAttivita cAtt = new ctrlAttivita(null);
            ListaDettAttivita =
                cAtt.GetDettagliByAttivitaId((Guid)gridAttivita.CurrentRow.Cells["id"].Value);
            if (ListaDettAttivita.Count > 0)
            {
                FormattaGriglia();
                for (int i = 0; i < ListaDettAttivita.Count; i++)
                {
                    DateTime dataora = new DateTime(
                        ListaDettAttivita[i].Giorno.Date.Year,
                        ListaDettAttivita[i].Giorno.Date.Month,
                        ListaDettAttivita[i].Giorno.Date.Day,
                        ListaDettAttivita[i].OraInizio,
                        ListaDettAttivita[i].MinutiInizio,
                        0
                        );
                    DateTime datadopo = new DateTime(
                        ListaDettAttivita[i].Giorno.Date.Year,
                        ListaDettAttivita[i].Giorno.Date.Month,
                        ListaDettAttivita[i].Giorno.Date.Day,
                        ListaDettAttivita[i].OraFine,
                        ListaDettAttivita[i].MinutiFine,
                        0
                        );
                    dataDett.Rows.Add(
                        ListaDettAttivita[i].Id,
                        ListaDettAttivita[i].Giorno,
                        dataora,
                        datadopo);
                }
            }
            else
            {
                FormattaGriglia();
            }
        }

        private void ControllaPermessi()
        {
            if (User != null)
            {
                ctrlUtente cUtente = new ctrlUtente();
                if (!cUtente.PuoModificare(User) ||
                    !cUtente.PuoScrivere(User))
                {
                    cmdAggiungi.Enabled = false;
                }
            }
        }

        public void AggiornaDaEsterni()
        {
            this.getAttivitaDettaglio();
            this.Cerca();
        }

        private void cmdAnnulla_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }

        private void cmdAggiungi_Click(object sender, System.EventArgs e)
        {
            frmAttivita frm = new frmAttivita(User, StatoForm.Nuovo, null, null);
            frm.MdiParent = this.MdiParent;
            frm.Left = 20;
            frm.Top = 20;
            frm.Show();
        }

        private void gridAttivita_SelectionChanged(object sender, System.EventArgs e)
        {
            getAttivitaDettaglio();
        }

        private void txtCerca_TextChanged(object sender, System.EventArgs e)
        {
            Cerca();
        }

        private void cmdCancellaAttivita_Click(object sender, EventArgs e)
        {
            CancellaAttivita();
        }

        private void cmdModificaAttivita_Click(object sender, EventArgs e)
        {
            if (gridAttivita.Rows.Count > 0
                && gridAttivita.SelectedRows.Count == 1)
            {
                frmAttivita frm = new frmAttivita(User, StatoForm.Modifica,
                    new ctrlAttivita(null).GetAttivitabyId((Guid)gridAttivita.SelectedRows[0].Cells["Id"].Value), this);
                frm.MdiParent = this.MdiParent;
                frm.Show();
            }
        }

        private void cmdModificaAttivitaDett_Click(object sender, EventArgs e)
        {
            if (gridAttivita.SelectedRows[0].Cells["Codice"].Value.ToString() == "")
            {
                MessageBox.Show("L'attivita non ha dei Dettagli in quanto è a Tempo Indeterminato!", "Attenzione"
                    , MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (gridDettAttivita.Rows.Count > 0
                && gridDettAttivita.SelectedRows.Count == 1)
            {
                ctrlAttivita cAttivita = new ctrlAttivita(null);
                Attivita Attivita = new Attivita();
                Attivita = cAttivita.GetAttivitabyId((Guid)gridAttivita.SelectedRows[0].Cells["Id"].Value);
                Attivita.DettagliAttivita = ListaDettAttivita;

                frmAttivitaDett frm = new frmAttivitaDett(User, Attivita, StatoForm.Modifica, this);
                frm.MdiParent = this.MdiParent;
                frm.Show();
            }
        }

        private void cmdAggiornaAttivita_Click(object sender, EventArgs e)
        {
            Cerca();
        }

        private void cmdAggiornaAttivitaDett_Click(object sender, EventArgs e)
        {
            getAttivitaDettaglio();
        }
    }
}